fix: some behavior for [hidden DSL] only#2510
Conversation
…ts for element attribute names
🦋 Changeset detectedLatest commit: de4f7ea The changes in this PR will be included in the next version bump. This PR includes changesets to release 9 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
📝 WalkthroughWalkthroughThis PR introduces fixes and improvements to the Lynx web-core platform by skipping the Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Warning Review ran into problems🔥 ProblemsGit: Failed to clone repository. Please run the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/web-platform/web-core/ts/client/decodeWorker/decode.worker.ts (1)
343-355:⚠️ Potential issue | 🟡 MinorMinor: redundant
json.pageConfig?.cardTypein fallback.Since
configwas already spread fromjson.pageConfigon line 345,config.cardTypeis effectivelyjson.pageConfig?.cardTypeat this point. The fallback chainjson.cardType ?? json.pageConfig?.cardType ?? 'react'could be simplified tojson.cardType ?? config.cardType ?? 'react'(mirroring the pattern used forappTypeon line 353). Functionally equivalent, just tidier.Also note that
config.cardTypeis only initialized inside thelepusCode?.rootstring branch; for JSON bundles that don't match that legacy shape,cardTyperemains whatever came frompageConfig(possibly undefined). Confirm that's the intended scope givenPageConfig.cardTypeis typed as a requiredstringdownstream.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/web-platform/web-core/ts/client/decodeWorker/decode.worker.ts` around lines 343 - 355, Replace the redundant fallback expression so cardType uses the already-spread config: change the assignment config.cardType = json.cardType ?? json.pageConfig?.cardType ?? 'react' to config.cardType = json.cardType ?? config.cardType ?? 'react' inside the lepusCode.root branch; additionally, if PageConfig.cardType must always be present downstream, ensure config.cardType is initialized outside the lepusCode?.root branch (e.g., set config.cardType = config.cardType ?? json.cardType ?? 'react' immediately after spreading json.pageConfig) so non-legacy bundles receive a sensible default.
🧹 Nitpick comments (2)
packages/web-platform/web-core/ts/client/mainthread/elementAPIs/createElementAPI.ts (1)
227-232: Consistency:__UpdateComponentInfostill setslynxEntryNameAttributefor__Card__.
__CreateComponentnow skips the attribute whenentryName === '__Card__', but__UpdateComponentInfoat lines 371-373 still unconditionally setslynxEntryNameAttributewhenentryis truthy. If a caller later updates a component withentry: '__Card__', the sentinel will leak into the DOM, defeating the fix. Consider applying the same guard there (and symmetrically in the server-side API).♻️ Suggested guard for `__UpdateComponentInfo`
- if (entry) { + if (entry && entry !== '__Card__') { element.setAttribute(lynxEntryNameAttribute, entry); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/web-platform/web-core/ts/client/mainthread/elementAPIs/createElementAPI.ts` around lines 227 - 232, The update path (__UpdateComponentInfo) currently unconditionally sets lynxEntryNameAttribute when entry is truthy, which can reintroduce the '__Card__' sentinel into the DOM; modify the logic in __UpdateComponentInfo to only call dom.setAttribute(lynxEntryNameAttribute, entry) when entry is truthy AND entry !== '__Card__' (matching the guard added to __CreateComponent), and apply the same conditional on the server-side API counterpart so the '__Card__' sentinel is never written back into DOM attributes.packages/web-platform/web-core/tests/element-apis.spec.ts (1)
131-144: Optional: also cover server__CreateComponentand__UpdateComponentInfo.The new test covers the client
__CreateComponentpath only. Since the same__Card__-skip rule was mirrored ints/server/elementAPIs/createElementAPI.ts, adding an analogous assertion under the existingServer Element APIs SSR Propagationdescribe block (and for__UpdateComponentInfoif the guard is added) would prevent regressions on either side.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/web-platform/web-core/tests/element-apis.spec.ts` around lines 131 - 144, Add tests that exercise the server-side implementations to mirror the client test for dropping the '__Card__' entry name: in the existing "Server Element APIs SSR Propagation" describe block add assertions that calling the server __CreateComponent implementation (from ts/server/elementAPIs/createElementAPI.ts) returns an element whose lynxEntryNameAttribute is null when passed '__Card__', and if you add the same guard to __UpdateComponentInfo also add an analogous assertion for that function. Locate and call the server-side helpers (the server __CreateComponent and __UpdateComponentInfo functions) and assert via __GetAttributeByName that the lynxEntryNameAttribute is null to prevent regressions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.changeset/fix-card-entry-name.md:
- Line 5: Update the changeset summary to remove the stray Markdown bold markers
and use the literal sentinel string __Card__ (or escape the underscores) so it
renders correctly in release notes; locate the line containing "**Card**" in the
changeset and replace it with the literal sentinel string __Card__ (or use
escaped underscores like \_\_Card\_\_) to avoid unintended bold formatting.
---
Outside diff comments:
In `@packages/web-platform/web-core/ts/client/decodeWorker/decode.worker.ts`:
- Around line 343-355: Replace the redundant fallback expression so cardType
uses the already-spread config: change the assignment config.cardType =
json.cardType ?? json.pageConfig?.cardType ?? 'react' to config.cardType =
json.cardType ?? config.cardType ?? 'react' inside the lepusCode.root branch;
additionally, if PageConfig.cardType must always be present downstream, ensure
config.cardType is initialized outside the lepusCode?.root branch (e.g., set
config.cardType = config.cardType ?? json.cardType ?? 'react' immediately after
spreading json.pageConfig) so non-legacy bundles receive a sensible default.
---
Nitpick comments:
In `@packages/web-platform/web-core/tests/element-apis.spec.ts`:
- Around line 131-144: Add tests that exercise the server-side implementations
to mirror the client test for dropping the '__Card__' entry name: in the
existing "Server Element APIs SSR Propagation" describe block add assertions
that calling the server __CreateComponent implementation (from
ts/server/elementAPIs/createElementAPI.ts) returns an element whose
lynxEntryNameAttribute is null when passed '__Card__', and if you add the same
guard to __UpdateComponentInfo also add an analogous assertion for that
function. Locate and call the server-side helpers (the server __CreateComponent
and __UpdateComponentInfo functions) and assert via __GetAttributeByName that
the lynxEntryNameAttribute is null to prevent regressions.
In
`@packages/web-platform/web-core/ts/client/mainthread/elementAPIs/createElementAPI.ts`:
- Around line 227-232: The update path (__UpdateComponentInfo) currently
unconditionally sets lynxEntryNameAttribute when entry is truthy, which can
reintroduce the '__Card__' sentinel into the DOM; modify the logic in
__UpdateComponentInfo to only call dom.setAttribute(lynxEntryNameAttribute,
entry) when entry is truthy AND entry !== '__Card__' (matching the guard added
to __CreateComponent), and apply the same conditional on the server-side API
counterpart so the '__Card__' sentinel is never written back into DOM
attributes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 11b47273-3189-415f-a8f9-962f7b15f41b
📒 Files selected for processing (6)
.changeset/fix-card-entry-name.md.changeset/solid-boats-lead.mdpackages/web-platform/web-core/tests/element-apis.spec.tspackages/web-platform/web-core/ts/client/decodeWorker/decode.worker.tspackages/web-platform/web-core/ts/client/mainthread/elementAPIs/createElementAPI.tspackages/web-platform/web-core/ts/server/elementAPIs/createElementAPI.ts
Merging this PR will degrade performance by 7.98%
|
| Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|
| ❌ | transform 1000 view elements |
43.1 ms | 46.8 ms | -7.98% |
Comparing PupilTong:p/hw/fix-create-component-entry-name (de4f7ea) with main (d8cdd7c)
Footnotes
-
26 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩
React External#662 Bundle Size — 679.93KiB (0%).de4f7ea(current) vs 7f6fc9c main#658(baseline) Bundle metrics
|
| Current #662 |
Baseline #658 |
|
|---|---|---|
0B |
0B |
|
0B |
0B |
|
0% |
0% |
|
0 |
0 |
|
3 |
3 |
|
17 |
17 |
|
5 |
5 |
|
8.59% |
8.59% |
|
0 |
0 |
|
0 |
0 |
Bundle analysis report Branch PupilTong:p/hw/fix-create-compon... Project dashboard
Generated by RelativeCI Documentation Report issue
React Example#7544 Bundle Size — 225.23KiB (0%).de4f7ea(current) vs 7f6fc9c main#7540(baseline) Bundle metrics
|
| Current #7544 |
Baseline #7540 |
|
|---|---|---|
0B |
0B |
|
0B |
0B |
|
0% |
0% |
|
0 |
0 |
|
4 |
4 |
|
179 |
179 |
|
69 |
69 |
|
44.57% |
44.57% |
|
2 |
2 |
|
0 |
0 |
Bundle size by type no changes
| Current #7544 |
Baseline #7540 |
|
|---|---|---|
145.76KiB |
145.76KiB |
|
79.47KiB |
79.47KiB |
Bundle analysis report Branch PupilTong:p/hw/fix-create-compon... Project dashboard
Generated by RelativeCI Documentation Report issue
Web Explorer#9116 Bundle Size — 899.85KiB (-0.02%).de4f7ea(current) vs 7f6fc9c main#9112(baseline) Bundle metrics
Bundle size by type
Bundle analysis report Branch PupilTong:p/hw/fix-create-compon... Project dashboard Generated by RelativeCI Documentation Report issue |
React MTF Example#676 Bundle Size — 196.39KiB (0%).de4f7ea(current) vs 7f6fc9c main#672(baseline) Bundle metrics
|
| Current #676 |
Baseline #672 |
|
|---|---|---|
0B |
0B |
|
0B |
0B |
|
0% |
0% |
|
0 |
0 |
|
3 |
3 |
|
173 |
173 |
|
66 |
66 |
|
44.07% |
44.07% |
|
2 |
2 |
|
0 |
0 |
Bundle size by type no changes
| Current #676 |
Baseline #672 |
|
|---|---|---|
111.23KiB |
111.23KiB |
|
85.15KiB |
85.15KiB |
Bundle analysis report Branch PupilTong:p/hw/fix-create-compon... Project dashboard
Generated by RelativeCI Documentation Report issue
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated. # Releases ## @lynx-js/react@0.120.0 ### Minor Changes - Bump `@lynx-js/internal-preact` from `10.28.4-dfff9aa` to `10.29.1-20260424024911-12b794f` ([diff](lynx-family/internal-preact@10.28.4-dfff9aa...10.29.1-20260424024911-12b794f)). ([#2512](#2512)) Fixes wrong DOM order when a keyed child moves to a different `$N` slot across a re-render. Cross-slot moves now land at the correct slot position instead of being appended past stable siblings. - Refactor preact to support multi-slots children and reduce the number and depth of snapshot. ([#1764](#1764)) ### Patch Changes - Fix stale callback-local references when transforming JSX inside `children={array.map(...)}` prop expressions. ([#2524](#2524)) - Fix ref callbacks not being cleaned up or re-applied correctly when the ref at the same element slot changes across rerenders that happen before hydration (e.g. a `useEffect` triggering `setState` during the initial background render). ([#2500](#2500)) - fix: reduce redundant updates for main-thread handlers and gestures ([#2188](#2188)) - Updates are faster when the main-thread event handler or gesture object is stable across rerenders (fewer unnecessary native updates). - Spread props rerenders that don't semantically change the handler/gesture no longer trigger redundant updates. - Removing a gesture from spread props reliably clears the gesture state on the target element. - Fix hydration edge cases by tolerating serialized snapshot nodes with missing `values` ([#2481](#2481)) - Keep ReactLynx Testing Library imports aligned with the contained snapshot runtime paths. ([#2498](#2498)) ## @lynx-js/template-webpack-plugin@0.11.0 ### Minor Changes - Add CSS source map support and source-mapped template encode diagnostics. ([#2483](#2483)) ### Patch Changes - fix: genStyleInfo should also preserve CSS variable fallback values when encoding web-core stylesheets so declarations like `var(--token, rgba(...))` are emitted with their fallback intact. ([#2502](#2502)) - Updated dependencies \[[`e179680`](e179680), [`8352530`](8352530), [`30f0277`](30f0277), [`887b8aa`](887b8aa), [`1d4abfc`](1d4abfc), [`25e196b`](25e196b), [`fb7bc84`](fb7bc84), [`9e149c4`](9e149c4), [`30f0277`](30f0277), [`9e149c4`](9e149c4)]: - @lynx-js/css-serializer@0.1.6 - @lynx-js/web-core@0.20.3 ## @lynx-js/i18next-translation-dedupe@0.0.1 ### Patch Changes - Introduce `@lynx-js/i18next-translation-dedupe` package to avoid bundling i18next translations twice in Lynx apps. ([#2482](#2482)) The package reads translations extracted by `rsbuild-plugin-i18next-extractor`, skips the extractor's default rendered asset, and writes the translations into the Lynx bundle custom section: ```json { "customSections": { "i18next-translations": { "content": { "en-US": { "hello": "Hello" }, "zh-CN": { "hello": "你好" } } } } } ``` ## @lynx-js/docs-mcp-server@0.2.2 ### Patch Changes - Fix Windows startup error. ([#2474](#2474)) ## @lynx-js/react-umd@0.120.0 ### Patch Changes - Support compile main-thread script to bytecode in external bundle ([#2459](#2459)) ## @lynx-js/rspeedy@0.14.3 ### Patch Changes - add a `sourceMap.css` option to emit CSS sourcemaps. ([#2442](#2442)) By default, `sourceMap.css` is false. You can set it to true to emit CSS sourcemaps. ```js import { defineConfig } from "@lynx-js/rspeedy"; export default defineConfig({ output: { sourceMap: { css: true, }, }, }); ``` - bump rsdoctor to 1.5.6 ([#2410](#2410)) - Enable CSS source maps by default in Rspeedy output config. ([#2483](#2483)) - Prefer physical routable IPv4 addresses over tunnel and link-local interfaces when resolving the dev host IP for generated preview and bundle URLs. ([#2409](#2409)) - Updated dependencies \[]: - @lynx-js/web-rsbuild-server-middleware@0.20.3 ## @lynx-js/lynx-bundle-rslib-config@0.3.2 ### Patch Changes - Support compile main-thread script to bytecode in external bundle ([#2459](#2459)) - Updated dependencies \[[`e179680`](e179680)]: - @lynx-js/css-serializer@0.1.6 ## @lynx-js/react-rsbuild-plugin@0.16.1 ### Patch Changes - Respect `dev.hmr: false` when installing React Refresh integrations so disabled HMR no longer injects the refresh loader or plugin. ([#2487](#2487)) - Fix stale callback-local references when transforming JSX inside `children={array.map(...)}` prop expressions. ([#2524](#2524)) - Supports @lynx-js/react 0.120.0 ([#1764](#1764)) - Updated dependencies \[[`e179680`](e179680), [`13655ac`](13655ac), [`f15494b`](f15494b), [`e179680`](e179680), [`e179680`](e179680)]: - @lynx-js/template-webpack-plugin@0.11.0 - @lynx-js/css-extract-webpack-plugin@0.7.1 - @lynx-js/react-webpack-plugin@0.9.2 - @lynx-js/react-alias-rsbuild-plugin@0.16.1 - @lynx-js/use-sync-external-store@1.5.0 - @lynx-js/react-refresh-webpack-plugin@0.3.5 ## @lynx-js/css-serializer@0.1.6 ### Patch Changes - Add CSS source map support and source-mapped template encode diagnostics. ([#2483](#2483)) ## @lynx-js/web-core@0.20.3 ### Patch Changes - fix: `__AddClass` triggers style updates when `enableCSSSelector` is `false` ([#2515](#2515)) `__AddClass` was missing the expected call to `update_css_og_style` when CSS selectors are disabled (`enableCSSSelector: false`). With this fix, dynamically adding a class correctly delegates style population from the template AST into the DOM, mirroring the behavior of `__SetClasses`. Added behavioral unit test and end-to-end playwright validations using dynamically generated JSON AST `styleInfo` mocks. - fix(web-core): skip setting lynxEntryNameAttribute for **Card** and use constants for server element APIs ([#2510](#2510)) - Fix componentCSSID behavior for SSR and main thread by calculating element css_id from parent component correctly. ([#2495](#2495)) - fix: avoid panic in dispatch_event_by_path when element data cannot be retrieved ([#2508](#2508)) - fix: filter out -1 uniqueId in commonEventHandler ([#2493](#2493)) - feat: add x-markdown support ([#2412](#2412)) Add opt-in support for the `x-markdown` element on Lynx Web, including Markdown rendering together with its related styling, interaction, animation, truncation, range rendering, and effect capabilities exposed through the component API. Update the `web-core`, `web-core-wasm`, and `web-mainthread-apis` runtime paths to use the shared property-or-attribute setter from `web-constants`, so custom elements such as `x-markdown` can receive structured property values correctly instead of being forced through string-only attribute updates. ```javascript import "@lynx-js/web-elements/XMarkdown"; ``` - fix: transformVH not work with cqw unit as the base length ([#2469](#2469)) - fix: add cardType resolution for legacy json lynx bundle ([#2510](#2510)) - fix: the default value of rpx is supposed to be 1/750 cqw ([#2469](#2469)) - Updated dependencies \[[`e179680`](e179680), [`647334c`](647334c), [`fb7bc84`](fb7bc84), [`9454dc4`](9454dc4), [`bdec498`](bdec498), [`b0247f9`](b0247f9), [`eec539a`](eec539a)]: - @lynx-js/css-serializer@0.1.6 - @lynx-js/web-elements@0.12.1 - @lynx-js/web-worker-rpc@0.20.3 ## @lynx-js/web-elements@0.12.1 ### Patch Changes - fix: XMarkdown slot created should not have prefix ([#2520](#2520)) - feat: add x-markdown support ([#2412](#2412)) Add opt-in support for the `x-markdown` element on Lynx Web, including Markdown rendering together with its related styling, interaction, animation, truncation, range rendering, and effect capabilities exposed through the component API. Update the `web-core`, `web-core-wasm`, and `web-mainthread-apis` runtime paths to use the shared property-or-attribute setter from `web-constants`, so custom elements such as `x-markdown` can receive structured property values correctly instead of being forced through string-only attribute updates. ```javascript import "@lynx-js/web-elements/XMarkdown"; ``` - fix: x-markdown inline view injection no longer queries light DOM children when the content attribute changes. Consumers must now pre-set `slot="{id}"` on the child element they want to project into `inlineview://{id}`. ([#2516](#2516)) - fix: list cannot drag-scroll inside x-foldview-slot-ng ([#2507](#2507)) Cause: `touchstart` used `elementsFromPoint(pageX, pageY)` (expects `clientX/clientY`), so hit-testing can miss the real inner scroller (e.g. `x-list` shadow `#content`) when the document is scrolled. Fix: use `elementsFromPoint(clientX, clientY)` + `event.composedPath()` for Shadow DOM, and keep `previousPageX` updated during `touchmove`. - fix: line-height of markdown-style should be added `px` ([#2509](#2509)) - fix: list `bindscrolltolower` may not trigger because the lower threshold ([#2484](#2484)) sentinel had no effective size or offset, causing the bottom `IntersectionObserver` to miss the list boundary ## @lynx-js/web-explorer@0.0.17 ### Patch Changes - bump rsdoctor to 1.5.6 ([#2410](#2410)) ## @lynx-js/css-extract-webpack-plugin@0.7.1 ### Patch Changes - Fix CSS source map line offsets when wrapping extracted CSS with cssId metadata. ([#2514](#2514)) - Support `@lynx-js/template-webpack-plugin` v0.11.0. ([#2483](#2483)) ## @lynx-js/react-webpack-plugin@0.9.2 ### Patch Changes - Support `@lynx-js/template-webpack-plugin` v0.11.0. ([#2483](#2483)) ## create-rspeedy@0.14.3 ## @lynx-js/react-alias-rsbuild-plugin@0.16.1 ## upgrade-rspeedy@0.14.3 ## @lynx-js/web-rsbuild-server-middleware@0.20.3 ## @lynx-js/web-worker-rpc@0.20.3 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Summary by CodeRabbit
Release Notes
Checklist